{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import os\n",
    "os.chdir('../')\n",
    "from ml_models import utils\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 一.简介\n",
    "逻辑回归(LogisticRegression)简单来看就是在线性回归模型外面再套了一个$Sigmoid$函数：  \n",
    "$$\n",
    "\\delta(t)=\\frac{1}{1+e^{-t}}\n",
    "$$\n",
    "它的函数形状如下：  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x233d3c47a58>]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x233d1bdaf98>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "t=np.arange(-8,8,0.5)\n",
    "d_t=1/(1+np.exp(-t))\n",
    "plt.plot(t,d_t)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "而将$t$替换为线性回归模型$w^Tx^*$（这里$x^*=[x^T,1]^T$）即可得到逻辑回归模型：  \n",
    "$$\n",
    "f(x)=\\delta(w^Tx^*)=\\frac{1}{1+e^{-(w^Tx^*)}}\n",
    "$$  \n",
    "我们可以发现：  \n",
    "$Sigmoid$函数决定了模型的输出在$(0,1)$区间，所以逻辑回归模型可以用作区间在$(0,1)$的回归任务，也可以用作$\\{0,1\\}$的二分类任务；同样，由于模型的输出在$(0,1)$区间，所以逻辑回归模型的输出也可以看作这样的“概率”模型：  \n",
    "$$\n",
    "P(y=1\\mid x)=f(x)\\\\\n",
    "P(y=0\\mid x)=1-f(x)\n",
    "$$  \n",
    "所以，逻辑回归的学习目标可以通过极大似然估计求解： \n",
    "$\\prod_{j=1}^n f(x_j)^{y_j}(1-f(x_j))^{(1-y_j)}$，即使得观测到的当前所有样本的所属类别概率尽可能大；通过对该函数取负对数，即可得到交叉熵损失函数：  \n",
    "$$\n",
    "L(w)=-\\sum_{j=1}^n y_j log(f(x_j))+(1-y_j)log(1-f(x_j))\n",
    "$$  \n",
    "这里$n$表示样本量，$x_j\\in R^m$，$m$表示特征量，$y_j\\in \\{0,1\\}$，接下来的与之前推导一样，通过梯度下降求解$w$的更新公式即可：  \n",
    "$$\n",
    "\\frac{\\partial L}{\\partial w}=-\\sum_{i=1}^n (y_i-f(x_i))x_i^*\n",
    "$$  \n",
    "所以$w$的更新公式：  \n",
    "$$\n",
    "w:=w-\\eta \\frac{\\partial L}{\\partial w}\n",
    "$$\n",
    "### 二.代码实现\n",
    "同LinearRegression类似，这里也将$L1,L2$的正则化功能加入"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "class LogisticRegression(object):\n",
    "    def __init__(self, fit_intercept=True, solver='sgd', if_standard=True, l1_ratio=None, l2_ratio=None, epochs=10,\n",
    "                 eta=None, batch_size=16):\n",
    "\n",
    "        self.w = None\n",
    "        self.fit_intercept = fit_intercept\n",
    "        self.solver = solver\n",
    "        self.if_standard = if_standard\n",
    "        if if_standard:\n",
    "            self.feature_mean = None\n",
    "            self.feature_std = None\n",
    "        self.epochs = epochs\n",
    "        self.eta = eta\n",
    "        self.batch_size = batch_size\n",
    "        self.l1_ratio = l1_ratio\n",
    "        self.l2_ratio = l2_ratio\n",
    "        # 注册sign函数\n",
    "        self.sign_func = np.vectorize(utils.sign)\n",
    "        # 记录losses\n",
    "        self.losses = []\n",
    "\n",
    "    def init_params(self, n_features):\n",
    "        \"\"\"\n",
    "        初始化参数\n",
    "        :return:\n",
    "        \"\"\"\n",
    "        self.w = np.random.random(size=(n_features, 1))\n",
    "\n",
    "    def _fit_closed_form_solution(self, x, y):\n",
    "        \"\"\"\n",
    "        直接求闭式解\n",
    "        :param x:\n",
    "        :param y:\n",
    "        :return:\n",
    "        \"\"\"\n",
    "        self._fit_sgd(x, y)\n",
    "\n",
    "    def _fit_sgd(self, x, y):\n",
    "        \"\"\"\n",
    "        随机梯度下降求解\n",
    "        :param x:\n",
    "        :param y:\n",
    "        :return:\n",
    "        \"\"\"\n",
    "        x_y = np.c_[x, y]\n",
    "        count = 0\n",
    "        for _ in range(self.epochs):\n",
    "            np.random.shuffle(x_y)\n",
    "            for index in range(x_y.shape[0] // self.batch_size):\n",
    "                count += 1\n",
    "                batch_x_y = x_y[self.batch_size * index:self.batch_size * (index + 1)]\n",
    "                batch_x = batch_x_y[:, :-1]\n",
    "                batch_y = batch_x_y[:, -1:]\n",
    "\n",
    "                dw = -1 * (batch_y - utils.sigmoid(batch_x.dot(self.w))).T.dot(batch_x) / self.batch_size\n",
    "                dw = dw.T\n",
    "\n",
    "                # 添加l1和l2的部分\n",
    "                dw_reg = np.zeros(shape=(x.shape[1] - 1, 1))\n",
    "                if self.l1_ratio is not None:\n",
    "                    dw_reg += self.l1_ratio * self.sign_func(self.w[:-1]) / self.batch_size\n",
    "                if self.l2_ratio is not None:\n",
    "                    dw_reg += 2 * self.l2_ratio * self.w[:-1] / self.batch_size\n",
    "                dw_reg = np.concatenate([dw_reg, np.asarray([[0]])], axis=0)\n",
    "\n",
    "                dw += dw_reg\n",
    "                self.w = self.w - self.eta * dw\n",
    "\n",
    "            # 计算losses\n",
    "            cost = -1 * np.sum(\n",
    "                np.multiply(y, np.log(utils.sigmoid(x.dot(self.w)))) + np.multiply(1 - y, np.log(\n",
    "                    1 - utils.sigmoid(x.dot(self.w)))))\n",
    "            self.losses.append(cost)\n",
    "\n",
    "    def fit(self, x, y):\n",
    "        \"\"\"\n",
    "        :param x: ndarray格式数据: m x n\n",
    "        :param y: ndarray格式数据: m x 1\n",
    "        :return:\n",
    "        \"\"\"\n",
    "        y = y.reshape(x.shape[0], 1)\n",
    "        # 是否归一化feature\n",
    "        if self.if_standard:\n",
    "            self.feature_mean = np.mean(x, axis=0)\n",
    "            self.feature_std = np.std(x, axis=0) + 1e-8\n",
    "            x = (x - self.feature_mean) / self.feature_std\n",
    "        # 是否训练bias\n",
    "        if self.fit_intercept:\n",
    "            x = np.c_[x, np.ones_like(y)]\n",
    "        # 初始化参数\n",
    "        self.init_params(x.shape[1])\n",
    "        # 更新eta\n",
    "        if self.eta is None:\n",
    "            self.eta = self.batch_size / np.sqrt(x.shape[0])\n",
    "\n",
    "        if self.solver == 'closed_form':\n",
    "            self._fit_closed_form_solution(x, y)\n",
    "        elif self.solver == 'sgd':\n",
    "            self._fit_sgd(x, y)\n",
    "\n",
    "    def get_params(self):\n",
    "        \"\"\"\n",
    "        输出原始的系数\n",
    "        :return: w,b\n",
    "        \"\"\"\n",
    "        if self.fit_intercept:\n",
    "            w = self.w[:-1]\n",
    "            b = self.w[-1]\n",
    "        else:\n",
    "            w = self.w\n",
    "            b = 0\n",
    "        if self.if_standard:\n",
    "            w = w / self.feature_std.reshape(-1, 1)\n",
    "            b = b - w.T.dot(self.feature_mean.reshape(-1, 1))\n",
    "        return w.reshape(-1), b\n",
    "\n",
    "    def predict_proba(self, x):\n",
    "        \"\"\"\n",
    "        预测为y=1的概率\n",
    "        :param x:ndarray格式数据: m x n\n",
    "        :return: m x 1\n",
    "        \"\"\"\n",
    "        if self.if_standard:\n",
    "            x = (x - self.feature_mean) / self.feature_std\n",
    "        if self.fit_intercept:\n",
    "            x = np.c_[x, np.ones(x.shape[0])]\n",
    "        return utils.sigmoid(x.dot(self.w))\n",
    "\n",
    "    def predict(self, x):\n",
    "        \"\"\"\n",
    "        预测类别，默认大于0.5的为1，小于0.5的为0\n",
    "        :param x:\n",
    "        :return:\n",
    "        \"\"\"\n",
    "        proba = self.predict_proba(x)\n",
    "        return (proba > 0.5).astype(int)\n",
    "\n",
    "    def plot_decision_boundary(self, x, y):\n",
    "        \"\"\"\n",
    "        绘制前两个维度的决策边界\n",
    "        :param x:\n",
    "        :param y:\n",
    "        :return:\n",
    "        \"\"\"\n",
    "        y = y.reshape(-1)\n",
    "        weights, bias = self.get_params()\n",
    "        w1 = weights[0]\n",
    "        w2 = weights[1]\n",
    "        bias = bias[0][0]\n",
    "        x1 = np.arange(np.min(x), np.max(x), 0.1)\n",
    "        x2 = -w1 / w2 * x1 - bias / w2\n",
    "        plt.scatter(x[:, 0], x[:, 1], c=y, s=50)\n",
    "        plt.plot(x1, x2, 'r')\n",
    "        plt.show()\n",
    "\n",
    "    def plot_losses(self):\n",
    "        plt.plot(range(0, len(self.losses)), self.losses)\n",
    "        plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 三.校验\n",
    "我们构造一批伪分类数据并可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import make_classification\n",
    "data,target=make_classification(n_samples=100, n_features=2,n_classes=2,n_informative=1,n_redundant=0,n_repeated=0,n_clusters_per_class=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((100, 2), (100,))"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.shape,target.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x233d4c86748>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x233d4c24630>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(data[:, 0], data[:, 1], c=target,s=50)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "####  训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "lr = LogisticRegression(l1_ratio=0.01,l2_ratio=0.01)\n",
    "lr.fit(data, target)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 查看loss值变化\n",
    "交叉熵损失"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x233d1bdaf28>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "lr.plot_losses()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 绘制决策边界：\n",
    "令$w_1x_1+w_2x_2+b=0$，可得$x_2=-\\frac{w_1}{w_2}x_1-\\frac{b}{w_2}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x233d5cdbe10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "lr.plot_decision_boundary(data,target)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.96"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#计算F1\n",
    "from sklearn.metrics import f1_score\n",
    "f1_score(target,lr.predict(data))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 与sklearn对比"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\app\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "                   intercept_scaling=1, l1_ratio=None, max_iter=100,\n",
       "                   multi_class='warn', n_jobs=None, penalty='l2',\n",
       "                   random_state=None, solver='warn', tol=0.0001, verbose=0,\n",
       "                   warm_start=False)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr = LogisticRegression()\n",
    "lr.fit(data, target)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3.119650945418208, 0.38515595805512637, -0.478776183999758)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "w1=lr.coef_[0][0]\n",
    "w2=lr.coef_[0][1]\n",
    "bias=lr.intercept_[0]\n",
    "w1,w2,bias"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "x1=np.arange(np.min(data),np.max(data),0.1)\n",
    "x2=-w1/w2*x1-bias/w2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x233d5f84cf8>]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x233d5f84d30>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(data[:, 0], data[:, 1], c=target,s=50)\n",
    "plt.plot(x1,x2,'r')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.96"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#计算F1\n",
    "f1_score(target,lr.predict(data))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 四.问题讨论：损失函数为何不用mse?\n",
    "上面我们基本完成了二分类LogisticRegression代码的封装工作，并将其放到liner_model模块方便后续使用，接下来我们讨论一下模型中损失函数选择的问题；在前面线性回归模型中我们使用了mse作为损失函数，并取得了不错的效果，而逻辑回归中使用的确是交叉熵损失函数；这是因为如果使用mse作为损失函数,梯度下降将会比较困难，在$f(x^i)$与$y^i$相差较大或者较小时梯度值都会很小，下面推导一下：  \n",
    "我们令：  \n",
    "$$\n",
    "L(w)=\\frac{1}{2}\\sum_{i=1}^n(y^i-f(x^i))^2\n",
    "$$  \n",
    "则有：  \n",
    "$$\n",
    "\\frac{\\partial L}{\\partial w}=\\sum_{i=1}^n(f(x^i)-y^i)f(x^i)(1-f(x^i))x^i\n",
    "$$  \n",
    "我们简单看两个极端的情况：  \n",
    "（1）$y^i=0,f(x^i)=1$时，$\\frac{\\partial L}{\\partial w}=0$；  \n",
    "（2）$y^i=1,f(x^i)=0$时，$\\frac{\\partial L}{\\partial w}=0$  \n",
    "接下来，我们绘图对比一下两者梯度变化的情况，假设在$y=1,x\\in(-10,10),w=1,b=0$的情况下"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "y=1\n",
    "x0=np.arange(-10,10,0.5)\n",
    "#交叉熵\n",
    "x1=np.multiply(utils.sigmoid(x0)-y,x0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "#mse\n",
    "x2=np.multiply(utils.sigmoid(x0)-y,utils.sigmoid(x0))\n",
    "x2=np.multiply(x2,1-utils.sigmoid(x0))\n",
    "x2=np.multiply(x2,x0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x233d6046048>]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x233d6046080>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x0,x1)\n",
    "plt.plot(x0,x2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可见在错分的那一部分（x<0）,mse的梯度值基本停留在0附近，而交叉熵会让越“错”情况具有越大的梯度值（这里称呼梯度值不准确，你明白意思就行~）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
